package com.asr.service;

import com.asr.config.AsrProperties;
import com.asr.dto.ModelInfo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
@RequiredArgsConstructor
public class ModelService {
    
    private final AsrProperties asrProperties;
    
    /**
     * 获取所有可用的 ASR 模型
     */
    public List<ModelInfo> getAvailableAsrModels() {
        List<ModelInfo> models = new ArrayList<>();
        
        Map<String, AsrProperties.AsrModel> asrModels = asrProperties.getModels().getAsr();
        if (asrModels != null) {
            asrModels.forEach((id, asrModel) -> {
                ModelInfo info = new ModelInfo();
                info.setId(id);
                info.setName(getModelDisplayName(id));
                info.setType(asrModel.getType());
                info.setDescription(getModelDescription(id, asrModel.getType()));
                
                // 对于 Whisper 模型，使用 decoder 作为 modelPath（前端兼容性）
                if ("whisper".equalsIgnoreCase(asrModel.getType())) {
                    info.setModelPath(asrModel.getDecoder());  // Whisper 使用 decoder
                } else {
                    info.setModelPath(asrModel.getModel());  // 其他模型使用 model
                }
                
                info.setTokensPath(asrModel.getTokens());
                info.setEncoderPath(asrModel.getEncoder());
                info.setDecoderPath(asrModel.getDecoder());
                models.add(info);
            });
        }
        
        return models;
    }
    
    /**
     * 获取指定 ASR 模型配置（原始配置）
     */
    public AsrProperties.AsrModel getAsrModel(String modelId) {
        Map<String, AsrProperties.AsrModel> asrModels = asrProperties.getModels().getAsr();
        return asrModels != null ? asrModels.get(modelId) : null;
    }
    
    /**
     * 获取指定 ASR 模型信息（包含格式化字段）
     */
    public ModelInfo getAsrModelInfo(String modelId) {
        AsrProperties.AsrModel asrModel = getAsrModel(modelId);
        if (asrModel == null) {
            return null;
        }
        
        ModelInfo info = new ModelInfo();
        info.setId(modelId);
        info.setName(getModelDisplayName(modelId));
        info.setType(asrModel.getType());
        info.setDescription(getModelDescription(modelId, asrModel.getType()));
        
        // 对于 Whisper 模型，使用 decoder 作为 modelPath
        if ("whisper".equalsIgnoreCase(asrModel.getType())) {
            info.setModelPath(asrModel.getDecoder());
        } else {
            info.setModelPath(asrModel.getModel());
        }
        
        info.setTokensPath(asrModel.getTokens());
        info.setEncoderPath(asrModel.getEncoder());
        info.setDecoderPath(asrModel.getDecoder());
        
        return info;
    }
    
    /**
     * 获取说话人模型配置
     */
    public AsrProperties.Speaker getSpeakerModel() {
        return asrProperties.getModels().getSpeaker();
    }
    
    /**
     * 获取模型显示名称
     */
    private String getModelDisplayName(String id) {
        switch (id) {
            case "paraformer-zh":
                return "Paraformer 中文";
            case "paraformer-trilingual":
                return "Paraformer 多语言（中文+粤语+英文）";
            case "whisper-large-v3":
                return "Whisper Large V3";
            case "sense-voice":
                return "Sense Voice";
            case "telespeech-ctc":
                return "Telespeech CTC";
            default:
                return id;
        }
    }
    
    /**
     * 获取模型描述
     */
    private String getModelDescription(String id, String type) {
        switch (id) {
            case "paraformer-zh":
                return "适用于中文语音识别，速度快，准确率高";
            case "paraformer-trilingual":
                return "支持中文、粤语和英文的多语言识别";
            case "whisper-large-v3":
                return "OpenAI Whisper 大模型，支持多语言，准确率极高";
            case "sense-voice":
                return "支持中文、英文、日文、韩文和粤语";
            case "telespeech-ctc":
                return "基于 CTC 的中文语音识别模型";
            default:
                return "ASR 模型 - " + type;
        }
    }
}
